package es.udc.acs.consorcio.sesion;

import java.io.ObjectInputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import es.udc.acs.database.Database;

public class GestorSesion {
	
	private static volatile HashMap<String, Sesion> sesiones = new HashMap<String, Sesion>();
	
	private GestorSesion(){}
	
	/**
	 * Devuelve null si la sesion no existe.
	 */
	public static Sesion getSesion(String idBanco){
		return sesiones.get(idBanco);
	}
	
	public static boolean addSesion(String idBanco, Sesion sesion){
		
		if (sesiones.containsKey(idBanco)){
			System.out.println("ya existe sesion");
			return false;
		}
		
		sesiones.put(idBanco, sesion);
		
		return true;
	}
	
	public static boolean removeSesion(String idBanco){
		
		if(sesiones.remove(idBanco) == null){
			return false;
		}
		return true;
	}
	
	
	/**
	 * Recupera las sesiones de la base de datos
	 */
	public static void cargarSesiones() {
		
		Connection conexion = Database.getInstancia().getConexion();

		try {
		    String sentencia = "SELECT id_banco, obj_sesion " 
		    		            +"FROM c_sesion " 
		    		            +"WHERE obj_sesion IS NOT NULL";

 
			Statement stmt = conexion.createStatement();
		    ResultSet rs   = stmt.executeQuery(sentencia);	  
			
			while (rs.next()) {
				
				String banco = rs.getString(1);
				Blob blob    = rs.getBlob(2);

			   // Se reconstruye el objeto con un ObjectInputStream
			   ObjectInputStream ois = new ObjectInputStream(blob.getBinaryStream());
			   Sesion sesion = (Sesion) ois.readObject();
	        		
			   addSesion(banco,sesion);
	        }	
		} catch (Exception e) {
			System.out.println("Error al recuperar sesiones/No hay");
		}
		
	}
	
	public static boolean mostrarSesiones() {
		
		Set set = sesiones.entrySet();
		Iterator iter = set.iterator();


		if (!iter.hasNext()) {
			System.out.println("No hay sesiones abiertas");
			return false;
		}
		
		System.out.println("--------------------------------------------");
		System.out.println("Sesiones actuales en el consorcio:");
		while (iter.hasNext()) {
			Map.Entry entry = (Map.Entry) iter.next();
			System.out.println(entry.getKey());		
		}
		System.out.println("--------------------------------------------");
		
		return true;
	}
	
}
